<?php

namespace app\file\controller;

use think\Controller;
use think\Db;
use app\common\controller\Base;

/**
 * @title 阿里云Oss代码更新
 * @description 阿里云Oss代码更新
 * @group oss代码更新
 * @param name:token type:String require:1 default:1 other: desc:toekn
 */
class OssFile extends Base
{


    /**
     * @title 上传配置
     * @description 上传配置
     * @author 开发者（梁敏）
     * @url /file/OssFile/uploadConfig
     * @method POST
     * @param name:table_id type:int require:1 default:0 other: desc:数据表ID
     * @param name:field type:array require:1 default:0 other: desc:字段信息
     *
     * @return:
     */
    function uploadConfig(){
        $name="default";
        $str="/config/";
        if(!$name){
            $mag['msg']="缺少参数name！";
            return $this->errorJson();
        }
        $finenames = [];
        getDirFilesLists(dirname($_SERVER['DOCUMENT_ROOT']),$finenames);
        foreach ($finenames as $finename){
            if(strpos($finename,$str)){
                uploadFile("config-zb",$name.str_replace(dirname($_SERVER['DOCUMENT_ROOT']),"",$finename),$finename);
            }
        }
    }

    function updateConfig(){
        $name="default";
        $list=getObjectList("config-zb",$name);
        foreach ($list as $info){
            getObject("config-zb", $info->getKey(),dirname($_SERVER['DOCUMENT_ROOT']).str_replace($name,"/",$info->getKey()));
        }
    }

    /**
     * 实例化阿里云OSS
     * @return object 实例化得到的对象
     * @return 此步作为共用对象，可提供给多个模块统一调用
     */
    function new_oss(){
        //获取配置项，并赋值给对象$config
        $config=config('aliyun_oss');
        //实例化OSS
        $oss=new \OSS\OssClient($config['KeyId'],$config['KeySecret'],$config['Endpoint']);
        return $oss;
    }
    /**
     * 上传指定的本地文件内容
     *
     * @param OssClient $ossClient OSSClient实例
     * @param string $bucket 存储空间名称
     * @param string $object 上传的文件名称
     * @param string $Path 本地文件路径
     * @return null
     */
    function uploadFile($bucket,$object,$Path){
        //try 要执行的代码,如果代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示
        try{
            //没忘吧，new_oss()是我们上一步所写的自定义函数
            $ossClient = new_oss();
            //uploadFile的上传方法
            $ossClient->uploadFile($bucket, $object, $Path);
        } catch(OssException $e) {
            //如果出错这里返回报错信息
//            dump($e->getMessage());
            return $e->getMessage();
        }
        //否则，完成上传操作
        return true;
    }

    /**
     * 下载指定的文件
     *
     * @param OssClient $ossClient OSSClient实例
     * @param string $bucket 存储空间名称
     * @param string $object 下载的文件名称
     * @param string $Path 本地文件路径
     * @return null
     */
    function getObject($bucket, $object, $Path){
        //try 要执行的代码,如果代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示
        try{
            //没忘吧，new_oss()是我们上一步所写的自定义函数
            $ossClient = new_oss();
            $options = array(
                OssClient::OSS_FILE_DOWNLOAD =>$Path
            );
            if(!is_dir(dirname($Path))){
                mkdir(dirname($Path));
            }
            //下载
            $ossClient->getObject($bucket, $object, $options);
        } catch(OssException $e) {
            //如果出错这里返回报错信息
            return $e->getMessage();
        }
        //否则，完成上传操作
        return true;
    }


    /*
     * 获取指定目录下指定文件后缀的函数
     * @$path   文件路径
     * @$ext    文件后缀名，默认为false为不指定，如果指定，请以数组方式传入
     * @$filename   使用时请提前赋值为空数组
     * @$recursive  是否递归查找，默认为true
     * @$baseurl    是否包含路径，默认包含
     */
    function getDirFilesLists($path,&$filename,$recursive = true,$ext = false,$baseurl = true){

        if(!$path){
            die('请传入目录路径');
        }
        $resource = opendir($path);
        if(!$resource){
            die('你传入的目录不正确');
        }
        //遍历目录
        while ($rows = readdir($resource)){
            //如果指定为递归查询
            if($recursive) {
                if (is_dir($path . '/' . $rows) && $rows != "." && $rows != "..") {
                    getDirFilesLists($path . '/' . $rows, $filename,$resource,$ext,$baseurl);
                } elseif ($rows != "." && $rows != "..") {
                    //如果指定后缀名
                    if($ext) {
                        //必须为数组
                        if (!is_array($ext)) {
                            die('后缀名请以数组方式传入');
                        }
                        //转换小写
                        foreach($ext as &$v){
                            $v = strtolower($v);
                        }
                        //匹配后缀
                        $file_ext = strtolower(pathinfo($rows)['extension']);
                        if(in_array($file_ext,$ext)){
                            //是否包含路径
                            if($baseurl) {
                                $filename[] = $path . '/' . $rows;
                            }else{
                                $filename[] = $rows;
                            }
                        }
                    }else{
                        if($baseurl) {
                            $filename[] = $path . '/' . $rows;
                        }else{
                            $filename[] = $rows;
                        }
                    }
                }
            }else{
                //非递归查询
                if (is_file($path . '/' . $rows) && $rows != "." && $rows != "..") {
                    if($baseurl) {
                        $filename[] = $path . '/' . $rows;
                    }else{
                        $filename[] = $rows;
                    }
                }
            }
        }
    }


    /**
     * 获取oss文件列表
     *
     * @param OssClient $ossClient OSSClient实例
     * @param string $bucket 存储空间名称
     * @param string $prefix 下载的文件夹
     * @return null
     */
    function getObjectList($bucket,$prefix){
        //try 要执行的代码,如果代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示
        $list=[];
        try{
            //没忘吧，new_oss()是我们上一步所写的自定义函数
            $ossClient = new_oss();
            $options = array(
                "delimiter"=>"/",
                "prefix"=>$prefix
            );
            $listObjectInfo = $ossClient->listObjects($bucket, $options);

            $objectList = $listObjectInfo->getObjectList(); // object list

            $prefixList = $listObjectInfo->getPrefixList(); // directory list

            if (!empty($prefixList)) {
                foreach ($prefixList as $prefixInfo) {
                    $_list=getObjectList($bucket,$prefixInfo->getPrefix());
                    if(!empty($_list)){
                        $list=array_merge($list,$_list);
                    }
                }
            }

            if (!empty($objectList)) {
                $list=array_merge($list,$objectList);
            }
        } catch(OssException $e) {
            //如果出错这里返回报错信息
            return $e->getMessage();
        }
        //否则，完成上传操作
        return $list;
    }
}
